package com.Lemon.Zhkuhealth.admin.controller;

import com.Lemon.Zhkuhealth.common.constant.MessageConstant;
import com.Lemon.Zhkuhealth.common.pojo.entity.Setmeal;
import com.Lemon.Zhkuhealth.common.pojo.vo.SetmealVo;
import com.Lemon.Zhkuhealth.common.util.PageResult;
import com.Lemon.Zhkuhealth.common.util.QueryPageBean;
import com.Lemon.Zhkuhealth.common.util.R;
import com.Lemon.Zhkuhealh.api.service.ISetmealService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*; // 导入所有常用注解

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/setmeal")
@RequiredArgsConstructor
public class SetmealController {
    @DubboReference
    private ISetmealService setmealService;
    private final RedisTemplate<String, String> redisTemplate;

    /**
     * 新增套餐
     * @param setmealVo 包含套餐信息和关联检查组ID
     * @return R
     */
    @PostMapping("/add")
    public R add(@RequestBody SetmealVo setmealVo) {
        Setmeal setmeal = setmealVo.getSetmeal();
        List<Long> checkGroupIds = setmealVo.getCheckGroupIds();
        try {
            setmealService.save(setmeal, checkGroupIds );
        } catch (Exception e) {
            log.error("新增套餐失败", e);
            return new R(false, MessageConstant.ADD_SETMEAL_FAIL);
        }
        return new R(true, MessageConstant.ADD_SETMEAL_SUCCESS);
    }


    /**
     * 根据条件参数查询套餐列表数据 (分页查询)
     *
     * @param queryPageBean 查询条件（当前页码、每页大小、查询字符串）
     * @return PageResult
     */
    @PostMapping("/findPage")
    public R findPage(@RequestBody QueryPageBean queryPageBean) {
        try {
            PageResult<Setmeal> pageResult =
                    setmealService.page(
                            queryPageBean.getCurrentPage(),
                            queryPageBean.getPageSize(),
                            queryPageBean.getQueryString());
            return new R(true, MessageConstant.QUERY_SETMEAL_SUCCESS,pageResult);
        } catch (Exception e) {
            return new R(false, MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    /**
     * 根据ID查询套餐信息
     * @param id 套餐ID
     * @return R
     */
    @GetMapping("/findById")
    public R findById(@RequestParam("id") Long id) {
        try {
            Setmeal setmeal = setmealService.findById(id);
            return new R(true, MessageConstant.QUERY_SETMEAL_SUCCESS, setmeal);
        } catch (Exception e) {
            log.error("查询套餐详情失败, id: {}", id, e);
            return new R(false, MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }

    /**
     * 根据套餐ID查询关联的检查组ID列表
     * @param id 套餐ID
     * @return R
     */
    @GetMapping("/findCheckGroupIdsBySetmealId")
    public R findCheckGroupIdsBySetmealId(@RequestParam("id") Long id) {
        try {
            List<Long> checkGroupIds = setmealService.findCheckGroupIdsBySetmealId(id);
            return new R(true, MessageConstant.QUERY_CHECKGROUP_SUCCESS, checkGroupIds);
        } catch (Exception e) {
            log.error("查询套餐关联检查组ID失败, setmealId: {}", id, e);
            return new R(false, MessageConstant.QUERY_CHECKGROUP_FAIL);
        }
    }

    /**
     * 编辑套餐
     * @param setmealVo 包含套餐信息和关联检查组ID
     * @return R
     */
    @PostMapping("/edit")
    public R edit(@RequestBody SetmealVo setmealVo) {
        Setmeal setmeal = setmealVo.getSetmeal();
        List<Long> checkGroupIds = setmealVo.getCheckGroupIds();
        try {
            setmealService.edit(setmeal, checkGroupIds);
        } catch (Exception e) {
            log.error("编辑套餐失败, setmealId: {}", setmeal.getId(), e);
            return new R(false, MessageConstant.EDIT_SETMEAL_FAIL);
        }
        return new R(true, MessageConstant.EDIT_SETMEAL_SUCCESS);
    }

    /**
     * 根据ID删除套餐
     * @param id 套餐ID
     * @return R
     */
    @DeleteMapping("/delete") // 使用 @DeleteMapping 更符合 RESTful 规范
    public R delete(@RequestParam("id") Long id) {
        try {
            setmealService.deleteById(id);

        } catch (RuntimeException e) { // 捕获可能由业务逻辑抛出的运行时异常，例如关联数据存在
            log.warn("删除套餐失败：{}", e.getMessage());
            return new R(false, e.getMessage()); // 通常业务异常会携带用户友好的消息
        } catch (Exception e) {
            log.error("删除套餐失败, id: {}", id, e);
            return new R(false, MessageConstant.DELETE_SETMEAL_FAIL);
        }
        return new R(true, MessageConstant.DELETE_SETMEAL_SUCCESS);
    }
    /**
     * 获取所有套餐列表
     * URL: /setmeal/findAll
     * 这个方法是根据前端 yuyue.vue 中的 axios.get('/setmeal/findAll') 调用补充的。
     * @return 统一响应结果 (List<Setmeal>)
     */
    @GetMapping("/findAll")
    public R findAll() {
        try {
            List<Setmeal> setmealList = setmealService.findAll(); // 假设 ISetmealService 中有 findAll 方法
            return new R(true, MessageConstant.QUERY_SETMEAL_SUCCESS, setmealList);
        } catch (Exception e) {
            log.error("查询所有套餐失败: {}", e.getMessage(), e);
            return new R(false, MessageConstant.QUERY_SETMEAL_FAIL);
        }
    }
}